var fractionToDecimal = function(numerator, denominator) {
    // 首先，对特殊情况进行处理
    if (denominator == 0) return "";   // 分母，分子为0
    if (numerator == 0) return "0";

    let rst = [];
    if ((denominator > 0) ^ (numerator > 0)) rst.push("-"); // 商为负的情况
    let denom = Math.abs(denominator); // 分子，分母化为整数
    let numer = Math.abs(numerator);

    // 然后，模仿除法手算过程，每次得到的商存起来（数组），余数和下一个商是对应的，所以将余数作为键存到map中，对应的值为下一个商在数组中的序号。新得到的余数*10，作为下个被除数，当新得到得余数已存在map中时，在该存在的余数对应的数组编号处插入前括号。
    let quotient = Math.floor(numer / denom);
    rst.push(quotient);
    let remainder = numer % denom;
    if (!remainder) return rst.join("");
    rst.push(".");  // 插入小数点
    let remMap = new Map();

    while (remainder && !remMap.has(remainder)) { // 小数部分
        remMap.set(remainder, rst.length);
        remainder *= 10;
        rst.push(Math.floor(remainder / denom));
        remainder %= denom;
    }

    if (remMap.has(remainder)) {
        rst.push(")");
        let index = remMap.get(remainder);
        rst.splice(index, 0, "(");
    }
    return rst.join("");
};

console.log(fractionToDecimal(4,333))
